package org.freez4.spring.validation;

import org.freez4.spring.ioc.overview.domain.User;
import org.springframework.context.MessageSource;
import org.springframework.context.support.StaticMessageSource;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;
import org.springframework.validation.ObjectError;

import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.logging.Logger;

/**
 * 错误文案示例。
 *
 * @author 阿坤同学
 * @date 2024/1/21 22:26
 * @see Errors
 */
public class ErrorsMessageDemo {

    public static final Logger logger = Logger.getLogger(ErrorsMessageDemo.class.getName());

    public static void main(String[] args) {
        // 0. 创建 User 对象
        User user = new User();
        user.setName("阿坤同学");
        // 1. 选择 Errors - BeanPropertyBindingResult
        Errors errors = new BeanPropertyBindingResult(user, "user");
        // 2. 调用 reject 或 rejectValue
        // reject 生成 ObjectError
        // reject 生成 FieldError
        errors.reject("user.properties.not.null");
        // user.name = user.getName()
        errors.rejectValue("id", "id.required");
        errors.rejectValue("age", "age.required");

        // 3. 获取 Errors 中 ObjectError 和 FieldError
        // FieldError() is ObjectError
        // 全局错误：errors.getFieldErrors()
        // 字段错误：errors.getFieldErrors()
        List<ObjectError> allErrors = errors.getAllErrors();

        // 4. 通过 ObjectError 和 FieldError 中的 code 和 args 来关联 MessageSource 实现
        MessageSource messageSource = createMessageSource();

        for (ObjectError error : allErrors) {
            String message = messageSource.getMessage(Objects.requireNonNull(error.getCode()), error.getArguments(), Locale.getDefault());
            logger.info(message);
        }
    }

    /**
     * 创建静态的MessageSource文案。当有匹配的code则返回对应文案
     *
     * @return MessageSource
     * @author 阿坤同学
     * @date 2024/1/21 22:36
     */
    static MessageSource createMessageSource() {
        StaticMessageSource messageSource = new StaticMessageSource();
        messageSource.addMessage("user.properties.not.null", Locale.getDefault(), "User 所有属性不能为空");
        messageSource.addMessage("id.required", Locale.getDefault(), "the id of User must not be null.");
        messageSource.addMessage("name.required", Locale.getDefault(), "the name of User must not be null.");
        messageSource.addMessage("age.required", Locale.getDefault(), "the age of User must not be null.");
        return messageSource;
    }
}